/*!
 * \file rsgispluginregistry.h
 * \brief 插件注册实现文件
 * \author 张龙星
 * \version 1.00.00
 * \date 2015-08-04
 * \copyright 航天恒星科技有限公司遥感测绘事业部
 * \details 编码文件使用UTF-8编码格式，使用匈牙利命名法，使用doxygen注释样式
 *          类名采用RSGIS开头，动态库抛出标识采用XXXX_EXPORT
 */
#ifndef RSGISPLUGINREGISTRY_H
#define RSGISPLUGINREGISTRY_H

#include <QStringList>
#include <QMap>
#include "rsgisapp_global.h"
#include "rsgispluginmetadata.h"

class RSGISInterface;

/*!
 * \brief The RSGISPluginRegistry是整个软件框架插件加载和卸载的核心类
 */
class RSGISAPPSHARED_EXPORT RSGISPluginRegistry
{
public:
    /*!
     * \brief instance 获取插件注册类指针，在第一次调用时创建对象
     * \return 插件注册类指针
     */
    static RSGISPluginRegistry* instance();

    /*!
     * \brief setInterface 设置插件接口，为appiterface作准备
     * \param iface 插件接口
     */
    void setInterface( RSGISInterface* iface );

    /*!
     * \brief isLoaded 检查模块是否加载
     * \param key 模块ID
     * \return 如果加载，返回为真，否则库假
     */
    bool isLoaded( QString key ) const;

    /*!
     * \brief library 根据模块ID获取插件名称
     * \param key 模块ID
     * \return 插件名称
     */
    QString library( QString key );

    //! Retrieve a pointer to a loaded plugin
    /*!
     * \brief plugin 根据模块ID获取插件指针
     * \param key 模块ID
     * \return 插件指针
     */
    RSGISPlugin * plugin( QString key );

    /*!
     * \brief addPlugin 增加插件
     * \param key 插件ID
     * \param metadata 插件元数据
     */
    void addPlugin( QString key, RSGISPluginMetadata metadata );

    /*!
     * \brief removePlugin 移除插件
     * \param key 插件ID
     */
    void removePlugin( QString key );

    /*!
     * \brief unloadAll 卸载所有插件
     */
    void unloadAll();

    /*!
     * \brief dump 序列化插件
     */
    void dump();

    /*!
     * \brief loadCppPlugin 加载C++插件
     * \param mFullPath 插件路径
     */
    void loadCppPlugin( QString mFullPath );

    /*!
     * \brief unloadCppPlugin 卸载C++插件
     * \param theFullPathName 插件路径
     */
    void unloadCppPlugin( QString theFullPathName );

    /*!
     * \brief restoreSessionPlugins 重新加载插件
     * \param thePluginDirList 插件路径目录
     */
    void restoreSessionPlugins( QStringList thePluginDirList );

    /*!
     * \brief restoreSessionPlugins 重新加载插件
     * \param thePluginDirString 插件目录
     */
    void restoreSessionPlugins( QString thePluginDirString );

    /*!
     * \brief pluginData 获取插件元数据列表
     * \return 插件元数据列表
     */
    QList<RSGISPluginMetadata*> pluginData();

protected:
    /*!
     * \brief RSGISPluginRegistry 构造函数
     */
    RSGISPluginRegistry();

    /*!
     * \brief checkCppPlugin 检查C++插件是否已经加载
     * \param pluginFullPath 插件全路径
     * \return 如果加载成功，则返回为真，否则返回为假
     */
    bool checkCppPlugin( QString pluginFullPath );


private:
    /*!
     * \brief m_sInstance 插件注册类实例
     */
    static RSGISPluginRegistry* m_sInstance;

    /*!
     * \brief m_Plugins 插件元数据列表
     */
    QMap<QString, RSGISPluginMetadata> m_Plugins;

    /*!
     * \brief m_pInterface 插件接口指针
     */
    RSGISInterface* m_pInterface;
};

#endif // RSGISPLUGINREGISTRY_H
